// OtherInfoWidget.h
// Created by Limou on 24-8-30.
// 可以根据一个其他用户信息, 制作一个其他用户名片

#ifndef FRONTEND_OTHERINFOWIDGET_HPP
#define FRONTEND_OTHERINFOWIDGET_HPP

#include <QDialog>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>
#include <QGridLayout>
#include <QHBoxLayout>
#include "../../common/Common.hpp"
#include "../../model/UserModel.hpp"

// >>> class OtherInfoWidget begin >>>
namespace chat_system::subassembly {
    class OtherInfoWidget : public QDialog {
    Q_OBJECT

    private:
        // 部件
        QPushButton* avatarBtn_; // 用户头像按钮

        QLabel* userIdTag_; // 用户 "账号" 标签
        QLabel* userIdLab_; // 用户账号内容标签

        QLabel* nickNameTag_; // 用户 "昵称" 标签
        QLabel* nickNameLab_; // 用户昵称内容标签

        QLabel* personalSignatureTag_; // 用户 "签名" 标签
        QLabel* personalSignatureLab_; // 用户签名内容标签

        QLabel* phoneNumberTag_; // 用户 "电话" 标签
        QLabel* phoneNumberLab_; // 用户电话内容标签

        QPushButton* addFriendBtn_; // 添加用户按钮
        QPushButton* deleteFriendBtn_; // 删除用户按钮
        QPushButton* sendFriendBtn_; // 发送用户按钮

        // 数据
        model::UserModel user_; // 对应用户

    public:
        // 构造方法
        explicit OtherInfoWidget(
            const model::UserModel& user = model::UserModel(),
            QWidget *parent = nullptr)
                : QDialog(parent)
                , avatarBtn_(new QPushButton(this))
                , userIdTag_(new QLabel(this))
                , userIdLab_(new QLabel(this))
                , nickNameTag_(new QLabel(this))
                , nickNameLab_(new QLabel(this))
                , personalSignatureTag_(new QLabel(this))
                , personalSignatureLab_(new QLabel(this))
                , phoneNumberTag_(new QLabel(this))
                , phoneNumberLab_(new QLabel(this))
                , addFriendBtn_(new QPushButton(this))
                , deleteFriendBtn_(new QPushButton(this))
                , sendFriendBtn_(new QPushButton(this))
                , user_(user) {
            this->setElement(); // 设置组件
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置信号槽
        }

        // 析构方法
        ~OtherInfoWidget() override = default;

    private:
        // 设置组件方法
        void setElement() {
            // TODO: 考虑把 user 做成非 const 的也不是不行, 这样一旦请求远端发现数据不同步, 更改的时候也可以实时更改传递过来的数据
            // 设置整体部件的属性
            this->setFixedSize(400, 180);
            this->setWindowTitle("个人名片");

            QIcon windowIcon(":/window/window_main/logo.png");
            if (windowIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): windowIcon is null"); }
            this->setWindowIcon(windowIcon);
            this->setAttribute(Qt::WA_DeleteOnClose); // NOTE: 设置窗口被关闭时自动释放, 避免点击过多造成内存泄漏
            this->move(QCursor::pos()); // 默认移动到鼠标的位置

            // 提前设置 tag 的尺寸
            QSize tagSize(50, 30);

            // 提前设置 lab 的尺寸
            int labSize = 30;

            // 提前设置按钮的尺寸
            QSize btnAndSubBtnSize(80, 20);

            // [头像]
            // 设置用户头像按钮
            auto size = QSize(50, 50);
            avatarBtn_->setFixedSize(size);
            avatarBtn_->setIconSize(size);

            // [账户]
            // 设置用户 "账号" 标签
            userIdTag_->setText("账户");
            userIdTag_->setFixedSize(tagSize);
            userIdTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            // 设置用户账号内容标签
            userIdLab_->setFixedHeight(labSize);
            userIdLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // [昵称]
            // 设置用户 "昵称" 标签
            nickNameTag_->setText("昵称");
            nickNameTag_->setFixedSize(tagSize);
            nickNameTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户昵称内容标签
            nickNameTag_->setFixedHeight(labSize);
            nickNameLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // [签名]
            // 设置用户 "签名" 标签
            personalSignatureTag_->setText("签名");
            personalSignatureTag_->setFixedSize(tagSize);
            personalSignatureTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户签名内容标签
            personalSignatureLab_->setFixedHeight(labSize);
            personalSignatureLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // [电话]
            // 设置用户 "电话" 标签
            phoneNumberTag_->setText("电话");
            phoneNumberTag_->setFixedSize(tagSize);
            phoneNumberTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户电话内容标签
            phoneNumberLab_->setFixedHeight(labSize);
            phoneNumberLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // 设置添加好友, 删除好友, 发送消息按钮
            addFriendBtn_->setText("添加好友");
            addFriendBtn_->setFixedSize(tagSize);
            addFriendBtn_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            addFriendBtn_->setStyleSheet(
                    "QPushButton {"
                    "color: green;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(233, 233, 233);"  // 默认背景颜色
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {"
                    "background-color: rgb(210, 210, 210);"  // 鼠标悬停时的背景颜色
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(198, 198, 198);"  // 鼠标按下时的背景颜色
                    "}"
            );
            addFriendBtn_->setFixedSize(btnAndSubBtnSize);

            deleteFriendBtn_->setText("删除好友");
            deleteFriendBtn_->setFixedSize(tagSize);
            deleteFriendBtn_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            deleteFriendBtn_->setStyleSheet(
                    "QPushButton {"
                    "color: red;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(233, 233, 233);"  // 默认背景颜色
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {"
                    "background-color: rgb(210, 210, 210);"  // 鼠标悬停时的背景颜色
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(198, 198, 198);"  // 鼠标按下时的背景颜色
                    "}"
            );
            deleteFriendBtn_->setFixedSize(btnAndSubBtnSize);

            sendFriendBtn_->setText("发送消息");
            sendFriendBtn_->setFixedSize(tagSize);
            sendFriendBtn_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            sendFriendBtn_->setStyleSheet(
                    "QPushButton {"
                    "color: black;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(233, 233, 233);"  // 默认背景颜色
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {"
                    "background-color: rgb(210, 210, 210);"  // 鼠标悬停时的背景颜色
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(198, 198, 198);"  // 鼠标按下时的背景颜色
                    "}"
            );
            sendFriendBtn_->setFixedSize(btnAndSubBtnSize);
            // TODO: 添加和删除涉及到服务端

            // TODO: if (该用户不是当前登录用户的好友) { addFriendBtn_->hide(); }

            // TODO: if (当前中测选中的会话不是群聊状态) { sendFriendBtn_->hide(); }

            // 设置具体内容
            avatarBtn_->setIcon(user_.getUserAvatarIco());
            userIdLab_->setText(user_.getUserId());
            nickNameLab_->setText(user_.getUserNickName());
            personalSignatureLab_->setText(user_.getUserPersonalSignature());
            phoneNumberLab_->setText(user_.getUserPhoneNumber());
        }

        // 设置组件样式方法
        void setElementStyle() {
            this->setStyleSheet(
                    "QDialog {"
                    "background-color: rgb(254, 254, 254);"
                    "}"
            );

            // 提前设置好 tag 的样式
            QString tagStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 800;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            // 提前设置好 lab 的样式
            QString labStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 500;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            avatarBtn_->setStyleSheet(
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
            );

            userIdTag_->setStyleSheet(tagStyle);
            userIdLab_->setStyleSheet(labStyle);
            nickNameTag_->setStyleSheet(tagStyle);
            nickNameLab_->setStyleSheet(labStyle);
            personalSignatureTag_->setStyleSheet(tagStyle);
            personalSignatureLab_->setStyleSheet(labStyle);
            phoneNumberTag_->setStyleSheet(tagStyle);
            phoneNumberLab_->setStyleSheet(labStyle);
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置布局管理器
            auto layout = new QGridLayout();
            auto hLayout = new QHBoxLayout();

            layout->setHorizontalSpacing(10);
            layout->setVerticalSpacing(3);
            layout->setContentsMargins(20, 0, 20, 0);
            this->setLayout(layout);
            layout->addWidget(avatarBtn_, 0, 0, 3, 1);

            layout->addWidget(userIdTag_, 0, 1);
            layout->addWidget(userIdLab_, 0, 2);

            layout->addWidget(nickNameTag_, 1, 1);
            layout->addWidget(nickNameLab_, 1, 2);

            layout->addWidget(personalSignatureTag_, 2, 1);
            layout->addWidget(personalSignatureLab_, 2, 2);

            layout->addWidget(phoneNumberTag_, 3, 1);
            layout->addWidget(phoneNumberLab_, 3, 2);

            hLayout->setContentsMargins(20, 0, 20, 0);
            hLayout->addWidget(addFriendBtn_);
            hLayout->addWidget(deleteFriendBtn_);
            hLayout->addWidget(sendFriendBtn_);

            layout->addLayout(hLayout, 4, 0, 1, 3);
        }

        // 设置信号槽
        void setElementSignalSlot() {

        }
    };
} // namespace chat_system end
// <<< class OtherInfoWidget end <<<

#endif // FRONTEND_OTHERINFOWIDGET_HPP
